
#include "nane/WindowSystem/Win32/Win32Window.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Win32Window::Win32Window( HWND _hWnd )
        : m_hWnd( _hWnd )
        , m_handler( NULL )
    {
        WinAPI::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Win32Window::~Win32Window()
    {
        WinAPI::SetWindowLongPtr(m_hWnd, GWLP_USERDATA, 0);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    LRESULT Win32Window::WindowProc( UINT _msg, WPARAM _wParam, LPARAM _lParam )
    {
        switch( _msg )
        {
        case WM_CLOSE:
            if( m_handler != NULL )
                m_handler->OnClose();
            return TRUE;
        }
        return WinAPI::DefWindowProc(m_hWnd, _msg, _wParam, _lParam);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IWindow::OSHandle Win32Window::GetOSHandle()
    {
        return static_cast<OSHandle>(m_hWnd);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void Win32Window::Show()
    {
        ::ShowWindow(m_hWnd, SW_SHOW);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void Win32Window::UpdateMessages()
    {
        MSG msg;
        while( WinAPI::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) == TRUE )
        {
            ::TranslateMessage(&msg);
            WinAPI::DispatchMessage(&msg);
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void Win32Window::SetMessageHandler( IWindowMessageHandler* _handler )
    {
        m_handler = _handler;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
